perm filename SQRT.FAI[SYS,HE] blob
sn#004207 filedate 1972-06-05 generic text, type T, neo UTF8
ENTRY SQRT
TITLE SQRT ROUTINE UNTIL PUT IN SAIL LIBRARY
A←13
B←14
P←17
SQRT: ;ENTRY TO SQUARE ROOT ROUTINE
SKIPG B,-1(P) ;PICK UP ARG. CHECK IF GREATER THAN 0
JRST SQRT4 ;NO, HANDLE NON-POSITIVE ARGUMENT
MOVEI A,0 ;GET EXPONENT TO A
LSHC A,=9
SUBI A,201 ;GET TRUE EXPONENT + 1
ROT A,-1 ;DIVIDE BY 2
HRRM A,SQRT2 ;AND STORE FOR FLOATING SCALE INST.
JUMPL A,SQRT3 ;JUMP IF FRACTION GREATER THAN .5
LSH B,=-9 ;RESTORE POSITION OF FRACTION IN B
FSC B,177 ;AND FIX UP EXPONENT .25 LESS THAN F LESS THAN .5
MOVEM B,F ;SAVE FRACTION
;COMPUTE LINEAR APPROX #1
FMPRI B,200640
FADRI B,177465
SQRT1: MOVE A,F ;1ST ITERATION OF NEWTON
FDV A,B ; F/APPROX
FAD B,A ; APPROX + F/APPROX
FSC B,-1 ; .5*( APPROX + F/APPROX)
MOVE A,F ;2ND ITERATION OF NEWTON
FDV A,B ; F/APPROX
FADR A,B ; APPROX + F/APPROX
SQRT2: FSC A,0 ;HALVE AND SCALE EXPONENT
MOVE 1,A ;RESULT IN AC 1
JRST EXIT ;RETURN
;HERE ON F GREATER THAN= .5
SQRT3: LSH B,=-9 ;RESTORE POSITION OF FRACTION IN B
FSC B,200 ;AND FIX UP EXPONENT .5 LESS THAN= F LESS THAN 1
MOVEM B,F ;SAVE FRACTION
;COMPUTE LINEAR APPROX #2
FMPRI B,200450
FADRI B,177660
JRST SQRT1 ;NOW GO ITERATE
SQRT4: JUMPE B,ZERO
OUTSTR [ASCIZ /SQRT: NEGATIVE ARGUMENT - 0 RETURNED/];
ZERO: MOVEI 1,0 ;HERE ON NON-POSITIVE ARG. RETURN ZERO
EXIT: SUB P,[XWD 2,2]
JRST @2(P)
F: BLOCK 1 ;STORE FRACTION HERE
END